<?php

/**
 * Un set de resultado de una consulta SQL
 * 
 * No crear instancias, utilizar {@see Connection::execute}
 */

namespace Lite\Sql\Mysql;

class MysqlResultSet implements ResultSet {
	
	private $result;
	
	function __construct($result){
		if( !is_resource($result)){
			throw new \BadMethodCallException(
				'$result should be a resource, given ' . gettype($result)
			);
		}
		$this->result = $result;
	}
	
	function __destruct(){
		$this->free();
	}
	/**
	 * Liberar el set de resultados
	 */
	function free() {
		if( is_resource($this->result)) {
			mysql_free_result($this->result);
		}
	}
	
	/**
	 * Obtener todos los registros del resultado en una sola operacion
	 * 
	 * @return array
	 */
	function fetchAll($type=ResultSet::BOTH){
			
		$rows = array();
		
		while( ($row = $this->fetch($type)) instanceof ResultRow )
			$rows[] = $row;
		
		return $rows;
	}
	
	/**
	 * Obtener el proximo resultado
	 * 
	 * @param int $type
	 * 
	 * @return ResultSet
	 */
	function fetch($type=ResultSet::BOTH){
		if( ResultSet::ASSOC == $type )
			return $this->fetchAssoc();
		if( ResultSet::NUM == $type )
			return $this->fetchRow();
		return $this->newInstanceRow( mysql_fetch_array($this->result));
	}
	
	/**
	 * Obtener el proximo resultado utilizando el metodo de acceso ResultSet::ASSOC
	 * 
	 * El resultado de la invocacion a este metodo es identico 
	 * a <code>fetch(ResultSet::ASSOC)</code>
	 * 
	 * @return ResultRow 
	 */	
	function fetchAssoc(){
		return $this->newInstanceRow( mysql_fetch_assoc($this->result));
	}
	
	/**
	 * Obtener el proximo resultado utilizando el metodo de acceso ResultSet::NUM
	 * 
	 * El resultado de la invocacion a este metodo es identico 
	 * a <code>fetch(ResultSet::NUM)</code>
	 * 
	 * @return ResultRow
	 */
	function fetchRow(){
		return $this->newInstanceRow( mysql_fetch_row($this->result));
	}
	
	private function newInstanceRow($row){
		return $row ? new MysqlResultRow( $row) : $row;
	}
	
	/**
	 * Cantidad de resultados obtenidos
	 * 
	 * @return integer
	 */
	function getRowCount() {
		return mysql_num_rows($this->result);
	}
	
	/**
	 * Cantidad de columnas obtenidos
	 * 
	 * @return integer
	 */
	function getFieldCount(){
		return mysql_num_fields($this->result);
	}
	
	/**
	 * Cantidad de columnas obtenidos
	 * 
	 * @return ResultRow
	 */
	function getFields() {
		$fields = array();
		
		while( null !== ($field = mysql_fetch_field($this->result)))
			$fields[] = $this->newInstanceRow( (array) $field );
		
		return $fields;
	}
	
	function getIterator(){
		return new ArrayIterator( $this->fetchAll( ));
	}
}
